#include <functional>
#include <iostream>

#include "Finctional.h"

int main()
{
    auto pFuncStr = print<std::string>; // 可调用对象函数指针，类型为void(*)（string）
    pFuncStr("Hello World"); // 常用类型

    auto pFunSelf = print<Test>;
    Test t{"Aiye" ,21,60};
    pFunSelf(t); // 自定义类型

    t("我真的不想当牛马"); // 仿函数
    t("好想摆烂",21); // 隐式类型调用

    auto func = [t](std::string strVar)
    {
        t(strVar);
    };
    func("开摸"); // lambda表达式调用

    std::function<void(std::string)> f1 = print<std::string>; // 可调用包装类绑定模板函数
    std::function<void(Test)> f2 = print<Test>;
    std::function<void(std::string)> f3 = t;
    f1("Hello function");
    f2({"Hello",21 ,40});
    f3("function");

    auto funBind = std::bind(&Test::operator(), t, std::placeholders::_1);
    funBind("Bind"); // 实际调用 t("Bind")

    return 0;
}

